/**
 * @author Angel Marcos Sosa León.
 */
package uoc.ei.practica;

import uoc.ei.tads.Iterador;
import uoc.ei.tads.IteradorVectorImpl;
import uoc.ei.tads.ListaEncadenada;

/**
 * Entidad que gestiona un Campeonato
 */

public class ChampionShip {
	
	/**
	 * Identificador Campeonato
	 */
	private String id;
	/**
	 * Lista palabras del campeonato
	 */
	private ListaEncadenada<Word> palabras;
	/**
	 * Vector donde se almancenan las letras de campeonato 
	 */
	private Letter[] letras;
	
	/**
	 * numero de letras Almacenadas en el Vector.Se usa para posicionar
	 */
	
	private int numLetras;
	/**
	 * Lista partidas del campeonato
	 */
	private ListaEncadenada<Game> partidas;
	
/**
 * Constructor de la clase ChampionShip. Inicializa las estructuras de datos
 */
public ChampionShip(String id) 
	{
		this.id=id;
		this.palabras=new ListaEncadenada<Word>();
		this.letras=new Letter[ScrabbleManager.MAX_LETTERS];
		this.partidas=new ListaEncadenada<Game>();
	}
/**
 * Añade una palabra a la lista de palabras del campeonato
 *  @param Letra a añadir
 */

public void addWord(Word palabra)
{
	palabras.insertarAlFinal(palabra);		
}
public String getId() {
	return id;
}
public void setId(String id) {
	this.id = id;
}

/**
 * método que proporciona una representación en un String de una Letra
 */

public String toString()
{
	return "id: "+id+"\n";
	
}

/**
 * método que proporciona un iterador de Palabras
 */
public Iterador<Word> words() throws EIException
{
	 if (palabras.estaVacio()) throw new EIException(Messages.NO_WORDS);
	 return  palabras.elementos();
	
}
/**
 * método que añade un Letra al diccionario del campeonato. Se valida que no se pueda superar la limitación máxima
 * @param Letra a añadir
 * @throws EIException Se lanza una excepción en caso que se supera la limitación
 */
public void addLetter(Letter letra) throws EIException
{
		if (this.getNumLetras()>=ScrabbleManager.MAX_LETTERS) 
		{
			throw new EIException(Messages.MAX_LETTERS);
		}
		else this.letras[this.numLetras++]=letra;
	}

/**
 * método que proporciona un iterador de Letras
 */

public Iterador<Letter> letras() throws EIException
{
	return new IteradorVectorImpl<Letter>(this.letras,this.getNumLetras(),0);
}

/**
 * Añade una palabra a la lista de palabras del campeonato
 *  @param Letra a añadir
 */

public void addGame(Game partida)
{
	partidas.insertarAlFinal(partida);		
}

/**
 * método que proporciona un iterador de Partidas
 */

public Iterador<Game> games() throws EIException
{
	 if (partidas.estaVacio()) throw new EIException(Messages.NO_GAMES);
	 return  partidas.elementos();
	
}
/**
 * método que proporciona una partida determinada
 * @param idGame la partida a buscar 
 * @return retorna la partida o null si no se encuentra
 */
public Game findGames(String idGame) throws EIException
{
	Game g = null;
	boolean found = false;
	Iterador<Game> it = partidas.elementos();
	while(it.haySiguiente()==true && found==false)
	{
		g=it.siguiente();
		if(g.getGameId().equals(idGame))
		{
			found = true;	
			
		}
	}
		
	return  found ? g : null;
}
/**
 * método que proporciona una letra determinada
 * @param idGame la letra a buscar 
 * @return retorna la letra o null si no se encuentra
 */
public Letter findLetters(String letter) throws EIException
{
	Letter l = null;
	boolean found = false;
	Iterador<Letter> it = this.letras();
	while(it.haySiguiente()==true && found==false)
	{
		l=it.siguiente();
		if(l.getLetra().equals(letter))
		{
			found = true;	
		}
	}
	return  found ? l : null;
	
}

/**
 * método que proporciona una palabra determinada
 * @param idGame la palabra a buscar 
 * @return retorna la palabra o null si no se encuentra
 */

public Word findWords(String palabra) throws EIException
{
	Word w = null;
	boolean found = false;
	Iterador<Word> it = palabras.elementos();
	while(it.haySiguiente()==true && found==false)
	{
		w=it.siguiente();
		if(w.getPalabra().equals(palabra))
		{
			found = true;	
		}
	}
	return  found ? w : null;
}
public int getNumLetras() {
	return numLetras;
}
public void setNumLetras(int numLetras) {
	this.numLetras = numLetras;
}

}
